Revert previous changeset. Needs more review.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 27 Jul 2006 13:06:15 +0000 (14:06 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 27 Jul 2006 13:06:15 +0000 (14:06 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/drivers/xen/netback/common.h
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
linux-2.6-xen-sparse/drivers/xen/netback/netback.c

index dd0b7dd8202a88a01291e513c4014e5a32d53266..c52aaa5f6c4c2f75735f01ee4fcb13f232c45ba8 100644 (file)
@@ -87,7 +87,7 @@ typedef struct netif_st {
 
        /* Miscellaneous private stuff. */
        enum { DISCONNECTED, DISCONNECTING, CONNECTED } status;
-
+       int active;
        struct list_head list;  /* scheduling list */
        atomic_t         refcnt;
        struct net_device *dev;
index 14ded171f7a8976101587edad9d414767c317c7d..f52e2601b7d0c73d750e629f823b6bac0e27df11 100644 (file)
@@ -37,7 +37,9 @@
 static void __netif_up(netif_t *netif)
 {
        struct net_device *dev = netif->dev;
-       netif_carrier_on(dev);
+       netif_tx_lock_bh(dev);
+       netif->active = 1;
+       netif_tx_unlock_bh(dev);
        enable_irq(netif->irq);
        netif_schedule_work(netif);
 }
@@ -47,7 +49,7 @@ static void __netif_down(netif_t *netif)
        struct net_device *dev = netif->dev;
        disable_irq(netif->irq);
        netif_tx_lock_bh(dev);
-       netif_carrier_off(dev);
+       netif->active = 0;
        netif_tx_unlock_bh(dev);
        netif_deschedule_work(netif);
 }
@@ -91,8 +93,6 @@ netif_t *netif_alloc(domid_t domid, unsigned int handle, u8 be_mac[ETH_ALEN])
                return ERR_PTR(-ENOMEM);
        }
 
-       netif_carrier_off(dev);
-
        netif = netdev_priv(dev);
        memset(netif, 0, sizeof(*netif));
        netif->domid  = domid;
index 76a32519ef93914b666b87cb0482110e716f8217..6795bcd3af4f9e3e7638a794b2a245464cf44417 100644 (file)
@@ -143,7 +143,7 @@ int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev)
        BUG_ON(skb->dev != dev);
 
        /* Drop the packet if the target domain has no receive buffers. */
-       if (unlikely(!netif_carrier_ok(dev)) ||
+       if (!netif->active || 
            (netif->rx_req_cons_peek == netif->rx.sring->req_prod) ||
            ((netif->rx_req_cons_peek - netif->rx.rsp_prod_pvt) ==
             NET_RX_RING_SIZE))
@@ -404,8 +404,7 @@ static void add_to_net_schedule_list_tail(netif_t *netif)
                return;
 
        spin_lock_irq(&net_schedule_list_lock);
-       if (!__on_net_schedule_list(netif) &&
-           likely(netif_carrier_ok(netif->dev))) {
+       if (!__on_net_schedule_list(netif) && netif->active) {
                list_add_tail(&netif->list, &net_schedule_list);
                netif_get(netif);
        }